package com.lc.util;

import com.alibaba.druid.pool.DruidDataSource;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.ResourceBundle;

/**
 * @description:数据库类，实现数据库连接、关闭和增删改查功能。
 * @author: ManolinCoder
 * @time: 2021/8/17
 */
public class BaseUtil {
    //声明连接池对象
    private static DruidDataSource ds;
    private Connection connection;
    private PreparedStatement pps;
    private ResultSet resultSet;
    static{
        //实例化数据库连接池对象
        ds=new DruidDataSource();
        //实例化配置对象,参数只写属性文件名即可，不需要写后缀
        ResourceBundle resourceBundle = ResourceBundle.getBundle("dbcpconfig");
        //设置驱动类全称
        ds.setDriverClassName(resourceBundle.getString("driverClassName"));
        //设置连接的数据库
        ds.setUrl(resourceBundle.getString("url"));
        //设置用户名
        ds.setUsername(resourceBundle.getString("username"));
        //设置密码
        ds.setPassword(resourceBundle.getString("password"));
        //设置最大连接数量
        ds.setMaxActive(Integer.parseInt(resourceBundle.getString("maxActive")));
    }

    //获取连接对象
    protected Connection getConnection() {
        try {
            connection = ds.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
        return connection;
    }

    //创建通道
    protected PreparedStatement getPps(String sql){
        try {
            pps = getConnection().prepareStatement(sql);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
            return null;
        }
        return pps;
    }

    //给占位符赋值 list中保存的是给占位符所赋的值
    private void setParams(List list){
        /*在执行SQL语句之前，必须为每个参数提供值。
        所属的setXXX()方法将值绑定到所述参数，其中XXX代表要绑定到输入参数的值的Java数据类型。如果忘记提供值，将收到一个SQLException。
        每个参数标记由其顺序位置引用。第一个标记表示位置1，下一个位置2等等。该方法与Java数组索引不同，不是从0开始。
        这里不确定传入的值的类型，所以是setObject。
        */
        try {
            if(list!=null&&list.size()>0){
                for (int i=0;i<list.size();i++) {
                    pps.setObject(i+1,list.get(i));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //查询方法
    protected ResultSet query(String sql, List list){
        try {
            getPps(sql);
            setParams(list);
            resultSet=pps.executeQuery();
            return resultSet;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    //关闭资源
    protected void closeall(){
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (pps != null) {
                pps.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
